// Memory.cpp

typedef struct WORD
{
    union
    {
        WORD *llink;        // 头部域，指向前驱结点
        WORD *uplink;       // 底部域，指向本结点头部
    };
    int tag;        // 快标志 0 空闲，1 占用，头部和尾部均有
    int size;       // 头部域 块大小
    WORD *rlink;    // 头部域 指向后继结点
    OtherType other;    // 字的其他部分
}WORD, head, foot, *Space;

Space AllocBoundTag(Space &pav, int n)
{
    // 若有不小于n的空闲块，则分配相应的存储块，并返回其首地址；否则返回NULL；
    // 若分配后可利用空间表不空，则pav指向表中刚分配过的结点的后继结点。
    Space p = pav;
    while(p && p->size < n && p->rlink != pav)
    {
        p = p->rlink;   // 查找不小于n的空闲块
    }

    if(!p || p->size < n)
    {
        return NULL;
    }
    else
    {
        f = FootLoc(p);
        pav = p->rlink;
        if(p->size - n <= e)
        {
            if(pav == p)
            {
                pav == NULL;
            }
            else
            {
                pav->llink = p->llink;
                p->llink->rlink = pav;
            }

            p->tag = f->tag = 1;
        }
        else
        {
            f->tag = 1;
            p->size = p->size - n;
            f = FootLoc(p);
            f->tag = 0;
            f->uplink = p;
            p = f + 1;
            p->tag = 1;
            p->size = n;
        }

        return p;
    }
}
